package edzest.basic;

import java.util.Scanner;

public class J08_Array {

	public static void main(String[] args) {
		// 배열 array
		// 동일한 자료형을 가지는 값들을
		// 저장할 수 있는 자료구조
		// 배열에 저장되는 내용을 요소element라 하고
		// 각 요소는 인덱스(위치값)을 이용해서
		// 접근할 수 있음
		// 위치값은 0부터 시작함
		
		// 배열 변수 선언
		int numbers[]; 	// 정수형 배열
		double taxes[]; // 실수형 배열
		char names[]; 	// 문자 배열
		
		// 배열 생성
		numbers = new int[10];	// 10개의 정수저장
		taxes = new double[10];	// 10개의 실수저장
		names = new char[10];	// 10개의 문자저장
		System.out.println( numbers ); // [I@1f297e7 int의 I
		System.out.println( taxes );   // [D@175078b double의 D
		System.out.println( names );
		//Prints an array of characters and then terminate the line.
		
		System.out.println( numbers[0] ); // 0 참조는 기본값 들어감
		System.out.println( numbers[1] ); // 0
		System.out.println( numbers[9] ); // 0
		System.out.println( taxes[0] ); // 0.0
		System.out.println( taxes[1] ); // 0.0
		System.out.println( taxes[9] ); // 0.0
		System.out.println( names[0] ); // 아무것도 안나옴
		System.out.println( names[1] ); // 아무것도 안나옴
		System.out.println( names[9] ); // 아무것도 안나옴
		
		names[0] = '수';
		names[1] = '지';
		names[2] = '!';
		System.out.println( names );
		System.out.println( names[0] );
		System.out.println( names[1] );
		System.out.println( names[2] );
		System.out.println( "" + names ); // [C@42552c char의 C
		//공백이랑 같이 출력하니 주소가 나온다 
		
		// numbers에 1 ~ 10까지 값 저장
		numbers[0] = 1;
		numbers[1] = 2;
		numbers[2] = 3;
		numbers[3] = 4;
		numbers[4] = 5;
		numbers[5] = 6;
		numbers[6] = 7;
		numbers[7] = 8;
		numbers[8] = 9;
		numbers[9] = 10;
		System.out.print( numbers[0] );
		System.out.print( numbers[2] );
		System.out.print( numbers[4] );
		System.out.print( numbers[6] );
		System.out.print( numbers[8] );
		System.out.println();
		
		// 반복문을 이용한 배열 처리
		for(int i = 0; i < 10; ++i){
			numbers[i] = i+1;
		}
		for(int i = 1; i <= 10; ++i){
			numbers[i-1] = i;
		}
		
		// 키보드로 입력받은 정수 5개를 그대로 출력
		Scanner sc = new Scanner(System.in);
		System.out.println("정수 5개를 입력하세요");
//		int num1 = sc.nextInt();
//		int num2 = sc.nextInt();
//		int num3 = sc.nextInt();
//		int num4 = sc.nextInt();
//		int num5 = sc.nextInt(); 
		// 이걸 for문으로 묶을려면 리플렉션이란느 고급프로그래밍을 해야됨
		// 각 코드에 공통요소가 없기 때문에
		// 반복문으로 변경 불가!
		
		int nums[] = new int[5];
//		nums[0] = sc.nextInt();
//		nums[1] = sc.nextInt();
//		nums[2] = sc.nextInt();
//		nums[3] = sc.nextInt();
//		nums[4] = sc.nextInt();
		// 각 코드에 공통요소가 있기 때문에
		// 반복문으로 변경 가능!
		for(int i = 0; i < 5; ++i){
			nums[i] = sc.nextInt();
		}
		for(int i = 0; i < 5; ++i){
			System.out.print( nums[i] + " ");
		}
		System.out.println();
		
		// 배열을 각 요소를 단순히 순차적으로
		// 처리할 목적이면 for-each로 처리하는 것이 좋음
		for( int i : nums){
			System.out.print( i + " ");
		}
		System.out.println();
		// for문 처음 돌 때 첫번째 요소 nums[0]이
		// int i에 들어가고
		// 두번째 돌 때  두번째 요소 nums[1]이
		// i에 들어가고... 이를 순차적으로 마지막 요소까지 반복
		
		// 배열의 크기 알아내기 : 배열이름.length 속성이용
		System.out.println( nums.length );
		System.out.println( numbers.length );
		
		// 배열사용시 볼 수 있는 오류
		double vals[] = new double[100];
		vals[0] = 100.0;
		// vals[100] = 100.0;
		// java.lang.ArrayIndexOutOfBoundsException
		// J08_Array.java:122 - J08_Array파일의 122번째 줄에서 
		vals[0] = 11;
		vals[0] = sc.nextDouble();
//		Exception in thread "main" java.util.InputMismatchException
//		at java.util.Scanner.throwFor(Scanner.java:909)
//		at java.util.Scanner.next(Scanner.java:1530)
//		at java.util.Scanner.nextDouble(Scanner.java:2456)
//		at edzest.basic.J08_Array.main(J08_Array.java:126)
		// 아래서 부터 본다
		
		sc.close();
	}

}
